// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.*;
// import com.alibaba.druid.sql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.clause.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.clause.ConditionValue.ConditionType;
// import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
// import com.alibaba.druid.sql.dialect.mysql.ast.expr.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.*;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption;
// import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification;
// import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils;
// import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
// import com.alibaba.druid.sql.visitor.VisitorFeature;
// import com.alibaba.druid.util.FnvHash;

// import java.io.IOException;
// import java.security.AccessControlException;
// import java.util.ArrayList;
// import java.util.std::list;
// import java.util.Map;
#pragma once
#include <string>
#include <list>
#include "../../../visitor/SQLASTOutputVisitor.h"
#include "MySqlASTVisitor.h"

class MySqlOutputVisitor
    : public SQLASTOutputVisitor,
      virtual public MySqlASTVisitor
{
public:
  MySqlOutputVisitor(std::stringstream *appender);

  MySqlOutputVisitor(std::stringstream *appender, BOOL_ptr parameterized);

  static BOOL_ptr shardingSupportChecked;

  void configFromProperty();

  bool isShardingSupport();

  void setShardingSupport(bool shardingSupport);

  // // @Override
  // BOOL_ptr visit(SQLSelectQueryBlock *select);

  // BOOL_ptr visit(MySqlSelectQueryBlock *x) ;

  // BOOL_ptr visit(SQLColumnDefinition *x) ;

  // BOOL_ptr visit(SQLDataType_ptr x) ;

  // // @Override
  // BOOL_ptr visit(SQLCharacterDataType *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlTableIndex *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlKey *x) override;

  // BOOL_ptr visit(SQLCharExpr *x, BOOL_ptr parameterized);

  // BOOL_ptr visit(SQLVariantRefExpr *x) ;

  // // @Override
  // BOOL_ptr visit(MySqlPrepareStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlExecuteStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlExecuteForAdsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlManageInstanceGroupStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRaftMemberChangeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRaftLeaderTransferStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlMigrateStatement *x) override;

  // // @Override
  // void endVisit(MySqlMigrateStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowClusterNameStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowJobStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowMigrateTaskStatusStatement *x) override;

  // BOOL_ptr visit(MysqlDeallocatePrepareStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlDeleteStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlInsertStatement *x) override;

  // void printValuesList(std::list<SQLInsertStatement.ValuesClause> valuesList);

  // // @Override
  // BOOL_ptr visit(MySqlLoadDataInFileStatement *x) override;

  // BOOL_ptr visit(SQLReplaceStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLStartTransactionStatement *x) override;

  // BOOL_ptr visit(SQLRollbackStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLShowTablesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowHMSMetaStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowDatabaseStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowWarningsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlLoadXmlStatement *x) override;

  // // @Override
  // BOOL_ptr visit(CobarShowStatus *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsShowDDLJobs *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsCancelDDLJob *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsRecoverDDLJob *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsRollbackDDLJob *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsRemoveDDLJob *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsInspectDDLJobCache *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsClearDDLJobCache *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsChangeDDLJob *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsBaselineStatement *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsShowGlobalIndex *x) override;

  // // @Override
  // BOOL_ptr visit(DrdsShowMetadataLock *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlBinlogStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlResetStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateUserStatement *x) override;

  // // @Override
  // BOOL_ptr visit(UserSpecification *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlPartitionByKey *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPlanCacheStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlClearPlanCacheStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlDisabledPlanCacheStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlExplainPlanCacheStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUpdatePlanCacheStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlOutFileExpr *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlExplainStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUpdateStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlSetTransactionStatement *x) override;

  // //
  // //    // @Override
  // //    BOOL_ptr visit(MySqlSetNamesStatement *x) override {
  // //        print0(ucase ? "SET NAMES " : "set names ");
  // //        if (x.isDefault()) {
  // //            print0(ucase ? "DEFAULT" : "default");
  // //        } else {
  // //            print0(x.getCharSet());
  // //            if (x.getCollate() != nullptr) {
  // //                print0(ucase ? " COLLATE " : " collate ");
  // //                print0(x.getCollate());
  // //            }
  // //        }
  // //        return BOOL::FALSE;
  // //    }

  // //    BOOL_ptr visit(MySqlSetCharSetStatement *x) override {
  // //        print0(ucase ? "SET CHARACTER SET " : "set character set ");
  // //        if (x.isDefault()) {
  // //            print0(ucase ? "DEFAULT" : "default");
  // //        } else {
  // //            print0(x.getCharSet());
  // //            if (x.getCollate() != nullptr) {
  // //                print0(ucase ? " COLLATE " : " collate ");
  // //                print0(x.getCollate());
  // //            }
  // //        }
  // //        return BOOL::FALSE;
  // //    }

  // // @Override
  // BOOL_ptr visit(MySqlShowAuthorsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowBinaryLogsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowMasterLogsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCollationStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowBinLogEventsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCharacterSetStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowContributorsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCreateDatabaseStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCreateEventStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCreateFunctionStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCreateProcedureStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowCreateTriggerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowEngineStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowEventsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowFunctionCodeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowFunctionStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowEnginesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowErrorsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowGrantsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUserName *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowMasterStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowOpenTablesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPluginsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPartitionsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLShowPartitionsStmt *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPrivilegesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowProcedureCodeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowProcedureStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowProcessListStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowProfileStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowProfilesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowRelayLogEventsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowSlaveHostsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowSlowStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowSequencesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowSlaveStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowTableStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlShowDbLockStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlShowHtcStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlShowStcStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowTriggersStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowRuleStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowRuleStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPhysicalProcesslistStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRenameSequenceStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCheckTableStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlCreateFullTextCharFilterStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlShowFullTextStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlShowCreateFullTextStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlAlterFullTextStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableDropClusteringKey *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlDropFullTextStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlCreateFullTextTokenizerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlCreateFullTextTokenFilterStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlCreateFullTextAnalyzerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlCreateFullTextDictionaryStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableAlterFullTextIndex *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlExtPartition *x) override;

  // BOOL_ptr visit(MySqlExtPartition.Item *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowTraceStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowBroadcastsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowDatasourcesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowNodeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowHelpStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlFlashbackStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowConfigStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowPlanCacheStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowDdlStatusStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowDsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlShowTopologyStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLShowVariantsStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableAddColumn *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRenameTableStatement.Item *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRenameTableStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUseIndexHint *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlIgnoreIndexHint *x) override;

  // BOOL_ptr visit(SQLExprTableSource_ptr x) override;

  // // @Override
  // BOOL_ptr visit(MySqlLockTableStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlLockTableStatement.Item *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUnlockTablesStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlForceIndexHint *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableChangeColumn *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableModifyColumn *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableOption *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterDatabaseSetOption *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterDatabaseKillJob *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlHelpStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCharExpr *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUnique *x) override;

  // // @Override
  // BOOL_ptr visit(MysqlForeignKey *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableDiscardTablespace *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateExternalCatalogStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableImportTablespace *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAssignItem *x) override;

  // // @Override
  // BOOL_ptr visit(TableSpaceOption *x) override;

  // void visitAggreateRest(SQLAggregateExpr aggregateExpr);

  // // @Override
  // BOOL_ptr visit(MySqlAnalyzeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlOptimizeStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterUserStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLSetStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlHintStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlOrderingExpr *x) override;

  // // @Override
  // BOOL_ptr visit(SQLBlockStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLIfStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLIfStatement.ElseIf *x) override;

  // // @Override
  // BOOL_ptr visit(SQLIfStatement.Else *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCaseStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlDeclareStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlSelectIntoStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlWhenStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLLoopStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlLeaveStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlIterateStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlRepeatStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCursorDeclareStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlUpdateTableSource *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableAlterColumn *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableForce *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableLock *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableOrderBy *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTableValidation *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlSubPartitionByKey *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlSubPartitionByValue *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTablePartitionCount *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableBlockSize *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableCompression *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlSubPartitionByList *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlDeclareHandlerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlDeclareConditionStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLAlterTableDropColumnItem *x) override;

  // /**
  //  * visit procedure create node
  //  */
  // // @Override
  // BOOL_ptr visit(SQLCreateProcedureStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLCreateFunctionStatement *x) override;

  // // @Override
  // BOOL_ptr visit(SQLCommentStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlFlushStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlEventSchedule *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateEventStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateAddLogFileGroupStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateServerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlCreateTableSpaceStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterEventStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterLogFileGroupStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterServerStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlAlterTablespaceStatement *x) override;

  // // @Override
  // BOOL_ptr visit(MySqlChecksumTableStatement *x) override;

  // void printQuery(SQLSelectQuery *x) override;

  void printInsertColumns(SQLExpr_list_ptr columns);

  // // @Override
  // BOOL_ptr visit(SQLValuesTableSource *x) override;

  // BOOL_ptr visit(SQLExternalRecordFormat *x) override;

  // BOOL_ptr visit(MySqlJSONTableExpr *x) override;

  // BOOL_ptr visit(MySqlJSONTableExpr.Column *x) override;

  // //    BOOL_ptr visit(SQLSelectItem_ptr x) override {
  // //        SQLExpr expr = x.getExpr();
  // //
  // //        if (expr instanceof SQLIdentifierExpr) {
  // //            print0(((SQLIdentifierExpr) expr).getName());
  // //        } else if (expr instanceof SQLPropertyExpr) {
  // //            visit((SQLPropertyExpr) expr);
  // //        } else {
  // //            printExpr(expr);
  // //        }
  // //
  // //        string_ptr  alias = x.getAlias();
  // //        if (alias != nullptr && alias.length() > 0) {
  // //            print0(ucase ? " AS " : " as ");
  // //
  // //            BOOL_ptr hasSpecial = BOOL::FALSE;
  // //            for (int i = 1; i < alias.length() - 1; ++i) {
  // //                char ch = alias.charAt(i);
  // //                if (ch == ' ' || ch == '\"' || ch == '\n') {
  // //                    hasSpecial = BOOL::TRUE;
  // //                }
  // //            }
  // //            char c0 = alias.charAt(0);
  // //            if (!hasSpecial) {
  // //                print0(alias);
  // //            } else {
  // //                print('"');
  // //
  // //                for (int i = 0; i < alias.length(); ++i) {
  // //                    char ch = alias.charAt(i);
  // //                    if (ch == '\"') {
  // //                        print('\\');
  // //                        print(ch);
  // //                    } else if (ch == '\n') {
  // //                        print0("\\n");
  // //                    } else {
  // //                        print(ch);
  // //                    }
  // //                }
  // //
  // //                print('"');
  // //            }
  // //        }
  // //        return BOOL::FALSE;
  // //    }

  // BOOL_ptr visit(MysqlAlterTableAlterCheck *x);

  // BOOL_ptr visit(MySqlXAStatement *x);
};
